﻿//Auktionshus projekt, DM10X2, Anders Østergaard, Jesper Larsen og Mads Jakobsen, 19.9.2011

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;

using System.IO;
using System.Threading;

namespace Auktion
{
    public class AuktionsMonitor
    {
        //******************************************************
        // Definering af delegat (type) - aktiverer de metoder man vil aktivere
        public delegate void TrådEventType(string bud, string ip);
        public event TrådEventType TrådEvent;
        private object read_update_lock = new object(); //låseobjekt
        // Definer metode "pegepind" gør det legalt at skrive += eller -= udenfor klassen --> Derefter skal vi i formen
        //******************************************************

        private int mindstePris = 0; // Angives inden auktionsstart
        private int accepteretBud = 0; // Nuværende bud (fra start er det mindsteprisen
        private IPAddress aktuelIpAdresse = IPAddress.Parse("0.0.0.0"); //den vindende klients ip adresse
        string server = "Server"; //for at auktionen kan se at beskederne kommer fra serveren og ikke klienten

        Thread HammerTråd; //tråd til at tælle ned 10, 5 og 3 sek hver gang der kommer et bud ind. starter forfra når et nyt bud kommer ind
        private bool StartHammerSlag = false; //starter nedtællingen // for at genstarte ændres værdien og så ændres den tilbage igen
        private bool StartHammerSlag2 = false; //lytter konstant på, om nedtællingen er startet,

        string text; //her gemmes de informationer der skal sendes til klienten

        private object bud_laas = new object(); // Privat låseobject

        public AuktionsMonitor()
        {
            lock (read_update_lock)
            {
                HammerTråd = new Thread(Hammerslag);
                HammerTråd.Start(); //tråden startes
                HammerTråd.IsBackground = true; //gøres til baggrundstråd
                accepteretBud = mindstePris; //mindsteprisen sættes til det nuværende accepteret bud
            }
        }

        public void ModtagBud(int bud, IPAddress ip) //klient sender en pris og sin ip (hans kendetegn)
        {
            Monitor.Enter(bud_laas); //en anden låsemetode
            int pris = bud; //gemmes lokalt, da dette bud ikke accepteres
            aktuelIpAdresse = ip; // og ip gemmes også så kan andre ikke ændre på disse inde i låsen

            //FOR LAVT BUD
            if (pris <= accepteretBud || pris < mindstePris && TrådEvent != null)
            {
                // Send besked til server og klient at budet er for lavt
                TrådEvent("Beklager, buddet er for lavt!", aktuelIpAdresse.ToString());
            }

            //ACCEPTERET BUD
            if (pris > accepteretBud && pris >= mindstePris)
            {
                accepteretBud = pris;//buddet er accepteret og gemmes
                aktuelIpAdresse = ip;
                if (accepteretBud > 0) //hvis accepteret bud er større nul, betyder det at der er budt første gang og det er accepteret - så skal hammernedtælling startes
                {
                    StartHammerSlag2 = true; //startes
                }
                // Besked til klient og server: budet er accepteret
                TrådEvent(accepteretBud.ToString(), aktuelIpAdresse.ToString());
            }
            Monitor.Exit(bud_laas); //låsen frigives
        }

        public void Hammerslag()
        {
            while (StartHammerSlag == false) //looper konstant
            {
                while (StartHammerSlag2 == true) //aktiveres ved første accepterede bud
                {
                    int kontrolbud = accepteretBud; //tjek værdien

                    Thread.Sleep(10000); //sov 10 sek

                    if (kontrolbud == accepteretBud) //tjek værdi igen og hvis den er ens betyder det der ikke er budt
                    {
                        text = "Hammerslag: Første";
                        TrådEvent(text, server); //send besked til klienten
                        Thread.Sleep(5000);
                    }
                    if (kontrolbud == accepteretBud) //tjek igen og hvis samme pris stadigvæk
                    {
                        text = "Hammerslag: Anden";
                        TrådEvent(text, server);
                        Thread.Sleep(3000);
                    }
                    if (kontrolbud == accepteretBud) //tjek igen
                    {
                        text = "Hammerslag: Tredje - SOLGT!";
                        TrådEvent(text, server);
                    }

                }
            }
        }

        //stopper hammertråden
        public void StopSignal()
        {
            StartHammerSlag = true;
            StartHammerSlag2 = false;
        }


        //Properties
        public int AccepteretBud
        {
            get { lock (this.read_update_lock) return accepteretBud; }
            set { lock (this.read_update_lock) accepteretBud = value; }
        }

        public IPAddress AktuelIpAdresse
        {
            get { lock (this.read_update_lock) return aktuelIpAdresse; }
            set { lock (this.read_update_lock) aktuelIpAdresse = value; }
        }

        public bool StartHammerSlag1
        {
            get { lock (this.read_update_lock) return StartHammerSlag; }
            set { lock (this.read_update_lock) StartHammerSlag = value; }
        }

        public bool StartHammerSlag21
        {
            get { lock (this.read_update_lock) return StartHammerSlag2; }
            set { lock (this.read_update_lock) StartHammerSlag2 = value; }
        }
    }
}
